package com.gbas.muspulp;

import pulpcore.Stage;
import pulpcore.animation.Easing;
import pulpcore.animation.Timeline;
import pulpcore.animation.event.TimelineEvent;
import pulpcore.image.CoreFont;
import pulpcore.image.CoreImage;
import pulpcore.scene.Scene2D;
import pulpcore.sprite.Group;
import pulpcore.sprite.ImageSprite;
import pulpcore.sprite.Label;
import pulpcore.sprite.Sprite;
import pulpcore.util.StringUtil;

import java.util.ArrayList;
import java.util.List;

/**
 * User: t50
 * Date: 10-abr-2010
 * Time: 11:25:38
 */
public class TextMessage extends Group {
    int initialY = 130;
    int maxY = 440;
    final String bloques[] = {"Block1.png", "Block2.png", "Block3.png", "Block4.png"};
    final CoreImage cImageBlock[] = {
            CoreImage.load(bloques[0]).fade(128),
            CoreImage.load(bloques[1]).fade(128),
            CoreImage.load(bloques[2]).fade(128),
            CoreImage.load(bloques[3]).fade(128)
    };
    int pyActual = initialY;
    final int maxWidth = Stage.getWidth() / 2;

    final CoreFont bgFont = CoreFont.load("serif.font.png");

    final int msgXY[][] = {
            {150, 480},
            {300, 300},
            {150, 10},
            {40, 150}
    };
    Scene2D scena;

    List<Integer> acumuladorUser = new ArrayList<Integer>();
    List<String> acumuladorTexto = new ArrayList<String>();

    public TextMessage(Scene2D scena) {
        super();
        this.scena = scena;
    }

    public void addMensajeTexto(String mensaje, int jugador) {
        String[] textLines = StringUtil.wordWrap(mensaje, bgFont, maxWidth);
        int altura = 20 + (textLines.length * (bgFont.getHeight() + 5));
        if (pyActual + altura > maxY) {
            // Acumula texto y espera espacio
            acumuladorTexto.add(mensaje);
            acumuladorUser.add(jugador);
            return;
        }
        addTextoSegundaFase(textLines, altura, jugador);

    }

    private void addTextoSegundaFase(String[] textLines, int altura, int jugador) {
        CoreImage ciCoreImage2 = cImageBlock[jugador].scale(maxWidth + 20, altura);
        final Group grpText = new Group(160, pyActual, 320, altura);
        pyActual += altura;
        grpText.add(new ImageSprite(ciCoreImage2, 0, 0));

        int px = 10;
        int py = 10;
        int startTime = 0;
        for (String line : textLines) {
            // Add the sprite
            Label label = new Label(bgFont, line, px, py);
            grpText.add(label);
            py += label.height.get() + 5;

            // Animate (typing effect)
            int numChars = line.length();
            label.numDisplayChars.set(0);
            label.numDisplayChars.animateTo(numChars, 30 * numChars, Easing.NONE, startTime);
            startTime += 30 * numChars + 100;
        }
        Timeline tm = new Timeline();
        tm.addEvent(new TimelineEvent(startTime * 2) {
            @Override
            public void run() {
                int altura = grpText.height.getAsInt();
                int py2 = grpText.y.getAsInt();

                remove(grpText);

                for (int k = 0; k < getNumSprites(); k++) {
                    Sprite sp = get(k);
                    if (sp != null) {
                        if (sp.y.getAsInt() > py2)
                            sp.y.animateTo(sp.y.getAsInt() - altura, 500);
                    }
                }
                pyActual -= altura;
                meteMasMensajes();
            }
        });
        add(grpText);
        scena.addTimeline(tm);
    }

    private void meteMasMensajes() {
        if (acumuladorUser.size() > 0) {
            String msg = acumuladorTexto.get(0);
            int jugador = acumuladorUser.get(0);

            String[] textLines = StringUtil.wordWrap(msg, bgFont, maxWidth);
            int alt = 20 + (textLines.length * (bgFont.getHeight() + 5));
            if (pyActual + alt <= maxY) {
                // Acumula texto y espera espacio
                acumuladorTexto.remove(0);
                acumuladorUser.remove(0);

                addTextoSegundaFase(textLines, alt, jugador);
                meteMasMensajes();
            }

        }
    }

}
